Docker 1.7で追加されたZFS storage driverを使ってみる
はじめに
Docker 1.7がリリースされましたね!
また新たな機能がたくさん追加されていますが、そのなかでも僕が一番興味を持ったのはZFS storage driverです!
ZFSはもともとSolaris上で実装されたファイルシステムで、UFSの次世代型ファイルシステムと言われています。仮想ボリュームをサポートしていたり、ファイルシステムとしてRAID機能をもっていたり、スナップショット機能があったりと、面白い機能がてんこ盛りです。
さっそく、DockerのZFS storage driverを触ってみました!
やってみた
試した環境はCentOS7(CentOS Linux release 7.1.1503) on EC2です。selinuxはdisabledにしています。
Docker 1.7のインストール
yumでDockerをインストールすると、まだ1.6しかインストールされません。なので公式ドキュメントに記載されているrpmをダウンロードして、ローカルインストールします。
$ curl -O -sSL https://get.docker.com/rpm/1.7.0/centos-7/RPMS/x86_64/docker-engine-1.7.0-1.el7.centos.x86_64.rpm $ sudo yum localinstall --nogpgcheck docker-engine-1.7.0-1.el7.centos.x86_64.rpm $ sudo systemctl start docker
バージョンを確認すると、ちゃんと1.7になっています。
$ sudo docker version Client version: 1.7.0 Client API version: 1.19 Go version (client): go1.4.2 Git commit (client): 0baf609 OS/Arch (client): linux/amd64 Server version: 1.7.0 Server API version: 1.19 Go version (server): go1.4.2 Git commit (server): 0baf609 OS/Arch (server): linux/amd64
ZFS storage driverを有効にする
一旦Dockerをサービス停止します。
$ sudo systemctl stop docker
ZFSをインストールします。
$ sudo yum localinstall --nogpgcheck https://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm $ sudo yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm $ sudo yum install kernel-devel zfs
ZFSストレージプールを作るためのファイルをddコマンドで作成します。
$ dd if=/dev/zero of=/tmp/disk.img bs=1024 count=1048576
そしてZFSストレージプールを作ります。
$ sudo zpool create zroot /tmp/disk.img
すでにある/var/lib/dockerを退避し、ZFSファイルシステムとしてマウントします。
$ sudo mv /var/lib/docker /var/lib/docker.org $ sudo zfs create zroot/docker -o mountpoint=/var/lib/docker
Dockerをサービス開始します。
$ sudo systemctl start docker
そしてdocker infoで確認すると、Storage Driverがzfsになっています!
$ sudo docker info Containers: 0 Images: 0 Storage Driver: zfs Zpool: zroot Zpool Health: ONLINE Parent Dataset: zroot/docker Space Used By Parent: 19456 Space Available: 1031696896 Parent Quota: no Compression: off Execution Driver: native-0.2 Logging Driver: json-file Kernel Version: 3.10.0-229.7.2.el7.x86_64 Operating System: CentOS Linux 7 (Core) CPUs: 1 Total Memory: 992.1 MiB Name: ip-172-31-4-69.ap-northeast-1.compute.internal ID: YCQE:I6Z3:XBRR:5X6N:GKPA:UTRY:NBLN:WAII:7UGN:PC7Y:SR26:LIQG
当然Dockerコンテナも普通に起動します。
$ sudo docker run busybox echo "Running on ZFS" Running on ZFS
ZFSのスナップショットを試してみる
ZFSなので/var/lib/dockerを丸ごとスナップショットとして取得することができます。
$ sudo zfs snapshot zroot/docker@20150626
もう一度Dockerコンテナを起動します。
$ sudo docker run busybox echo "Second running" Second running
すると、起動済みのDockerコンテナが2つあることがわかります。
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 058e3103f2b0 busybox "echo 'Second runnin 9 seconds ago Exited (0) 9 seconds ago happy_lumiere 591d8d47e8ce busybox "echo 'Running on ZF 2 minutes ago Exited (0) 2 minutes ago focused_bohr
では先ほど取得したZFSスナップショットでロールバックしてみます。ロールバック後はDockerサービスを再起動します。
$ sudo zfs rollback zroot/docker@20150626 $ sudo systemctl restart docker
再度確認すると、スナップショット取得後に起動したDockerコンテナが無くなっていることがわかります!
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 591d8d47e8ce busybox "echo 'Running on ZF 4 minutes ago Exited (0) 4 minutes ago focused_bohr
さいごに
今回はZFSプールをファイルで作成しましたが、EBSをRAID構成にしてZFSプールにすれば信頼性も向上しますし、ZFSスナップショット機能によってDocker環境のみのバックアップとリストアが可能になります。便利ですね!